package com.example.mybatisdemo.controller;

import com.example.mybatisdemo.dao.EmployeeDao;
import com.example.mybatisdemo.entity.Employee;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Controller
@Slf4j
@Tag(name = "员工管理接口", description = "员工管理相关接口")
public class EmployeeController {
    public static Logger logger = LoggerFactory.getLogger(EmployeeController.class);

    @Autowired
    EmployeeDao employeeDao;

    /*     请求路径---确定资源---employees
           请求方法--查询--get
           请求参数 --过滤条件--无
           请求响应---所有员工 List<Employee>----json
     */
    @Operation(summary = "获取所有员工信息")
    @RequestMapping(value ="/employees",method = RequestMethod.GET)
    @ResponseBody
    public List<Employee> list(){
        logger.info("获取所有员工信息-开始，这是一个GET请求");
        logger.debug("debug级别日志信息");
        logger.info("info级别日志信息");
        logger.warn("Warn级别日志信息");
        logger.error("error级别日志信息");
        //查询mysql数据库，得到员工列表信息
        List<Employee> list = employeeDao.findAll();
        logger.info("获取员工信息-完成");
        return list;
    }

    //新增一个员工：
    /*请求路径---确定资源---employees
      请求方法--添加--post
      请求参数 --员工相关属性--name,age
      请求响应--- 新增员工对象--Employee----json
     */
    @Operation(summary = "添加新员工")
    @RequestMapping(value ="/employees",method = RequestMethod.POST)
    @ResponseBody
    public Employee save(@Parameter(description = "员工信息") @RequestBody Employee employee){
        logger.info("新增一个员工，这是一个POST请求");
        // 参数验证
        if(employee.getName() == null || employee.getName().trim().isEmpty()){
            logger.error("员工姓名不能为空");
            throw new IllegalArgumentException("员工姓名不能为空");
        }
        if(employee.getEmail() == null || employee.getEmail().trim().isEmpty()){
            logger.error("员工邮箱不能为空");
            throw new IllegalArgumentException("员工邮箱不能为空");
        }
        if(employee.getSalary() < 0){
            logger.warn("员工薪资不能为负数，已设置为0");
            employee.setSalary(0);
        }
        try {
            // 检查ID是否已存在
            if(employee.getId() > 0) {
                Employee existingEmployee = employeeDao.getEmployeeById(employee.getId());
                if(existingEmployee != null) {
                    logger.error("员工ID已存在: {}", employee.getId());
                    throw new IllegalArgumentException("员工ID已存在");
                }
            }
            
            // 添加员工
            employeeDao.addEmployee(employee);
            logger.info("成功添加员工: {}", employee.getName());
            return employee;
        } catch (Exception e) {
            logger.error("添加员工失败: {}", e.getMessage());
            throw new RuntimeException("添加员工失败: " + e.getMessage());
        }
    }

    //更新一个员工
    /*请求路径---确定资源---employees
      请求方法--更新--put
      请求参数 --员工相关属性--id,name,age
      请求响应--- 新增员工对象--Employee----json
    */
    @Operation(summary = "更新员工信息")
    @RequestMapping(value ="/employees",method = RequestMethod.PUT)
    @ResponseBody
    public String update(@Parameter(description = "员工信息") @RequestBody Employee employee){
        logger.info("更新一个员工，这是一个PUT请求");
        //查询mysql数据库，得到员工列表信息
        Employee temp = employeeDao.getEmployeeById(employee.getId());
        if (temp != null){
            employeeDao.updateEmployee(employee);
            return "success";
        }

        return "false";
    }

    //删除一个员工
    /*请求路径---确定资源---employees
      请求方法--删除--delete
      请求参数 --员工相关属性--id
      请求响应--- 新增员工对象--Employee----json
     */
    @Operation(summary = "删除员工")
    @RequestMapping(value ="/employees/{id}",method = RequestMethod.DELETE)
    @ResponseBody
    public String delete(@Parameter(description = "员工ID") @PathVariable int id){
        logger.info("删除一个员工，这是一个DELETE请求");
        //查询mysql数据库，得到员工列表信息
        employeeDao.deleteEmployee(id);
        return "success";
    }

    //分页查询
    @Operation(summary = "分页查询员工")
    @RequestMapping(value ="/employees/page",method = RequestMethod.GET)
    @ResponseBody
    public PageInfo<Employee> pageUser1(@Parameter(description = "页码") @RequestParam int pageNumber,
                                       @Parameter(description = "每页数量") @RequestParam  int pageSize) {
        PageHelper.startPage(pageNumber,pageSize);
        List<Employee> list = employeeDao.findAll();
        PageInfo<Employee> info = new PageInfo<>(list);
        return info;
    }

}
